1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package com.google.common.collect;
18
19 import static com.google.common.base.Preconditions.checkArgument;
20 import static com.google.common.base.Preconditions.checkNotNull;
21
22 import com.google.common.annotations.GwtCompatible;
23 import com.google.common.annotations.GwtIncompatible;
24 import com.google.common.base.Predicate;
25 import com.google.common.base.Predicates;
26 import com.google.common.collect.Collections2.FilteredCollection;
27
28 import java.io.Serializable;
29 import java.util.AbstractSet;
30 import java.util.Arrays;
31 import java.util.Collection;
32 import java.util.Collections;
33 import java.util.Comparator;
34 import java.util.EnumSet;
35 import java.util.HashSet;
36 import java.util.Iterator;
37 import java.util.LinkedHashSet;
38 import java.util.List;
39 import java.util.Map;
40 import java.util.NavigableSet;
41 import java.util.NoSuchElementException;
42 import java.util.Set;
43 import java.util.SortedSet;
44 import java.util.TreeSet;
45 import java.util.concurrent.ConcurrentHashMap;
46 import java.util.concurrent.CopyOnWriteArraySet;
47
48 import javax.annotation.Nullable;
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63 @GwtCompatible(emulated = true)
64 public final class Sets {
65 private Sets() {}
66
67
68
69
70
71 abstract static class ImprovedAbstractSet<E> extends AbstractSet<E> {
72 @Override
73 public boolean removeAll(Collection<?> c) {
74 return removeAllImpl(this, c);
75 }
76
77 @Override
78 public boolean retainAll(Collection<?> c) {
79 return super.retainAll(checkNotNull(c));
80 }
81 }
82
83
84
85
86
87
88
89
90
91
92
93
94
95 @GwtCompatible(serializable = true)
96 public static <E extends Enum<E>> ImmutableSet<E> immutableEnumSet(
97 E anElement, E... otherElements) {
98 return ImmutableEnumSet.asImmutable(EnumSet.of(anElement, otherElements));
99 }
100
101
102
103
104
105
106
107
108
109
110
111
112
113 @GwtCompatible(serializable = true)
114 public static <E extends Enum<E>> ImmutableSet<E> immutableEnumSet(
115 Iterable<E> elements) {
116 if (elements instanceof ImmutableEnumSet) {
117 return (ImmutableEnumSet<E>) elements;
118 } else if (elements instanceof Collection) {
119 Collection<E> collection = (Collection<E>) elements;
120 if (collection.isEmpty()) {
121 return ImmutableSet.of();
122 } else {
123 return ImmutableEnumSet.asImmutable(EnumSet.copyOf(collection));
124 }
125 } else {
126 Iterator<E> itr = elements.iterator();
127 if (itr.hasNext()) {
128 EnumSet<E> enumSet = EnumSet.of(itr.next());
129 Iterators.addAll(enumSet, itr);
130 return ImmutableEnumSet.asImmutable(enumSet);
131 } else {
132 return ImmutableSet.of();
133 }
134 }
135 }
136
137
138
139
140
141
142
143 public static <E extends Enum<E>> EnumSet<E> newEnumSet(Iterable<E> iterable,
144 Class<E> elementType) {
145 EnumSet<E> set = EnumSet.noneOf(elementType);
146 Iterables.addAll(set, iterable);
147 return set;
148 }
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163 public static <E> HashSet<E> newHashSet() {
164 return new HashSet<E>();
165 }
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181 public static <E> HashSet<E> newHashSet(E... elements) {
182 HashSet<E> set = newHashSetWithExpectedSize(elements.length);
183 Collections.addAll(set, elements);
184 return set;
185 }
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200 public static <E> HashSet<E> newHashSetWithExpectedSize(int expectedSize) {
201 return new HashSet<E>(Maps.capacity(expectedSize));
202 }
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217 public static <E> HashSet<E> newHashSet(Iterable<? extends E> elements) {
218 return (elements instanceof Collection)
219 ? new HashSet<E>(Collections2.cast(elements))
220 : newHashSet(elements.iterator());
221 }
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236 public static <E> HashSet<E> newHashSet(Iterator<? extends E> elements) {
237 HashSet<E> set = newHashSet();
238 Iterators.addAll(set, elements);
239 return set;
240 }
241
242
243
244
245
246
247
248
249
250
251
252
253 public static <E> Set<E> newConcurrentHashSet() {
254 return newSetFromMap(new ConcurrentHashMap<E, Boolean>());
255 }
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271 public static <E> Set<E> newConcurrentHashSet(
272 Iterable<? extends E> elements) {
273 Set<E> set = newConcurrentHashSet();
274 Iterables.addAll(set, elements);
275 return set;
276 }
277
278
279
280
281
282
283
284
285
286
287
288 public static <E> LinkedHashSet<E> newLinkedHashSet() {
289 return new LinkedHashSet<E>();
290 }
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306 public static <E> LinkedHashSet<E> newLinkedHashSetWithExpectedSize(
307 int expectedSize) {
308 return new LinkedHashSet<E>(Maps.capacity(expectedSize));
309 }
310
311
312
313
314
315
316
317
318
319
320
321
322 public static <E> LinkedHashSet<E> newLinkedHashSet(
323 Iterable<? extends E> elements) {
324 if (elements instanceof Collection) {
325 return new LinkedHashSet<E>(Collections2.cast(elements));
326 }
327 LinkedHashSet<E> set = newLinkedHashSet();
328 Iterables.addAll(set, elements);
329 return set;
330 }
331
332
333
334
335
336
337
338
339
340
341
342
343 public static <E extends Comparable> TreeSet<E> newTreeSet() {
344 return new TreeSet<E>();
345 }
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362 public static <E extends Comparable> TreeSet<E> newTreeSet(
363 Iterable<? extends E> elements) {
364 TreeSet<E> set = newTreeSet();
365 Iterables.addAll(set, elements);
366 return set;
367 }
368
369
370
371
372
373
374
375
376
377
378
379
380 public static <E> TreeSet<E> newTreeSet(Comparator<? super E> comparator) {
381 return new TreeSet<E>(checkNotNull(comparator));
382 }
383
384
385
386
387
388
389
390
391
392
393
394 public static <E> Set<E> newIdentityHashSet() {
395 return Sets.newSetFromMap(Maps.<E, Boolean>newIdentityHashMap());
396 }
397
398
399
400
401
402
403
404
405
406
407 @GwtIncompatible("CopyOnWriteArraySet")
408 public static <E> CopyOnWriteArraySet<E> newCopyOnWriteArraySet() {
409 return new CopyOnWriteArraySet<E>();
410 }
411
412
413
414
415
416
417
418
419 @GwtIncompatible("CopyOnWriteArraySet")
420 public static <E> CopyOnWriteArraySet<E> newCopyOnWriteArraySet(
421 Iterable<? extends E> elements) {
422
423
424 Collection<? extends E> elementsCollection = (elements instanceof Collection)
425 ? Collections2.cast(elements)
426 : Lists.newArrayList(elements);
427 return new CopyOnWriteArraySet<E>(elementsCollection);
428 }
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445 public static <E extends Enum<E>> EnumSet<E> complementOf(
446 Collection<E> collection) {
447 if (collection instanceof EnumSet) {
448 return EnumSet.complementOf((EnumSet<E>) collection);
449 }
450 checkArgument(!collection.isEmpty(),
451 "collection is empty; use the other version of this method");
452 Class<E> type = collection.iterator().next().getDeclaringClass();
453 return makeComplementByHand(collection, type);
454 }
455
456
457
458
459
460
461
462
463
464
465
466
467
468 public static <E extends Enum<E>> EnumSet<E> complementOf(
469 Collection<E> collection, Class<E> type) {
470 checkNotNull(collection);
471 return (collection instanceof EnumSet)
472 ? EnumSet.complementOf((EnumSet<E>) collection)
473 : makeComplementByHand(collection, type);
474 }
475
476 private static <E extends Enum<E>> EnumSet<E> makeComplementByHand(
477 Collection<E> collection, Class<E> type) {
478 EnumSet<E> result = EnumSet.allOf(type);
479 result.removeAll(collection);
480 return result;
481 }
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514 public static <E> Set<E> newSetFromMap(Map<E, Boolean> map) {
515 return Platform.newSetFromMap(map);
516 }
517
518
519
520
521
522
523
524
525
526
527
528 public abstract static class SetView<E> extends AbstractSet<E> {
529 private SetView() {}
530
531
532
533
534
535
536
537
538
539
540 public ImmutableSet<E> immutableCopy() {
541 return ImmutableSet.copyOf(this);
542 }
543
544
545
546
547
548
549
550
551
552
553 public <S extends Set<E>> S copyInto(S set) {
554 set.addAll(this);
555 return set;
556 }
557 }
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579 public static <E> SetView<E> union(
580 final Set<? extends E> set1, final Set<? extends E> set2) {
581 checkNotNull(set1, "set1");
582 checkNotNull(set2, "set2");
583
584 final Set<? extends E> set2minus1 = difference(set2, set1);
585
586 return new SetView<E>() {
587 @Override public int size() {
588 return set1.size() + set2minus1.size();
589 }
590 @Override public boolean isEmpty() {
591 return set1.isEmpty() && set2.isEmpty();
592 }
593 @Override public Iterator<E> iterator() {
594 return Iterators.unmodifiableIterator(
595 Iterators.concat(set1.iterator(), set2minus1.iterator()));
596 }
597 @Override public boolean contains(Object object) {
598 return set1.contains(object) || set2.contains(object);
599 }
600 @Override public <S extends Set<E>> S copyInto(S set) {
601 set.addAll(set1);
602 set.addAll(set2);
603 return set;
604 }
605 @Override public ImmutableSet<E> immutableCopy() {
606 return new ImmutableSet.Builder<E>()
607 .addAll(set1).addAll(set2).build();
608 }
609 };
610 }
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638 public static <E> SetView<E> intersection(
639 final Set<E> set1, final Set<?> set2) {
640 checkNotNull(set1, "set1");
641 checkNotNull(set2, "set2");
642
643 final Predicate<Object> inSet2 = Predicates.in(set2);
644 return new SetView<E>() {
645 @Override public Iterator<E> iterator() {
646 return Iterators.filter(set1.iterator(), inSet2);
647 }
648 @Override public int size() {
649 return Iterators.size(iterator());
650 }
651 @Override public boolean isEmpty() {
652 return !iterator().hasNext();
653 }
654 @Override public boolean contains(Object object) {
655 return set1.contains(object) && set2.contains(object);
656 }
657 @Override public boolean containsAll(Collection<?> collection) {
658 return set1.containsAll(collection)
659 && set2.containsAll(collection);
660 }
661 };
662 }
663
664
665
666
667
668
669
670
671
672
673
674
675 public static <E> SetView<E> difference(
676 final Set<E> set1, final Set<?> set2) {
677 checkNotNull(set1, "set1");
678 checkNotNull(set2, "set2");
679
680 final Predicate<Object> notInSet2 = Predicates.not(Predicates.in(set2));
681 return new SetView<E>() {
682 @Override public Iterator<E> iterator() {
683 return Iterators.filter(set1.iterator(), notInSet2);
684 }
685 @Override public int size() {
686 return Iterators.size(iterator());
687 }
688 @Override public boolean isEmpty() {
689 return set2.containsAll(set1);
690 }
691 @Override public boolean contains(Object element) {
692 return set1.contains(element) && !set2.contains(element);
693 }
694 };
695 }
696
697
698
699
700
701
702
703
704
705
706
707
708
709 public static <E> SetView<E> symmetricDifference(
710 Set<? extends E> set1, Set<? extends E> set2) {
711 checkNotNull(set1, "set1");
712 checkNotNull(set2, "set2");
713
714
715 return difference(union(set1, set2), intersection(set1, set2));
716 }
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745 public static <E> Set<E> filter(
746 Set<E> unfiltered, Predicate<? super E> predicate) {
747 if (unfiltered instanceof SortedSet) {
748 return filter((SortedSet<E>) unfiltered, predicate);
749 }
750 if (unfiltered instanceof FilteredSet) {
751
752
753 FilteredSet<E> filtered = (FilteredSet<E>) unfiltered;
754 Predicate<E> combinedPredicate
755 = Predicates.<E>and(filtered.predicate, predicate);
756 return new FilteredSet<E>(
757 (Set<E>) filtered.unfiltered, combinedPredicate);
758 }
759
760 return new FilteredSet<E>(
761 checkNotNull(unfiltered), checkNotNull(predicate));
762 }
763
764 private static class FilteredSet<E> extends FilteredCollection<E>
765 implements Set<E> {
766 FilteredSet(Set<E> unfiltered, Predicate<? super E> predicate) {
767 super(unfiltered, predicate);
768 }
769
770 @Override public boolean equals(@Nullable Object object) {
771 return equalsImpl(this, object);
772 }
773
774 @Override public int hashCode() {
775 return hashCodeImpl(this);
776 }
777 }
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808 public static <E> SortedSet<E> filter(
809 SortedSet<E> unfiltered, Predicate<? super E> predicate) {
810 return Platform.setsFilterSortedSet(unfiltered, predicate);
811 }
812
813 static <E> SortedSet<E> filterSortedIgnoreNavigable(
814 SortedSet<E> unfiltered, Predicate<? super E> predicate) {
815 if (unfiltered instanceof FilteredSet) {
816
817
818 FilteredSet<E> filtered = (FilteredSet<E>) unfiltered;
819 Predicate<E> combinedPredicate
820 = Predicates.<E>and(filtered.predicate, predicate);
821 return new FilteredSortedSet<E>(
822 (SortedSet<E>) filtered.unfiltered, combinedPredicate);
823 }
824
825 return new FilteredSortedSet<E>(
826 checkNotNull(unfiltered), checkNotNull(predicate));
827 }
828
829 private static class FilteredSortedSet<E> extends FilteredSet<E>
830 implements SortedSet<E> {
831
832 FilteredSortedSet(SortedSet<E> unfiltered, Predicate<? super E> predicate) {
833 super(unfiltered, predicate);
834 }
835
836 @Override
837 public Comparator<? super E> comparator() {
838 return ((SortedSet<E>) unfiltered).comparator();
839 }
840
841 @Override
842 public SortedSet<E> subSet(E fromElement, E toElement) {
843 return new FilteredSortedSet<E>(((SortedSet<E>) unfiltered).subSet(fromElement, toElement),
844 predicate);
845 }
846
847 @Override
848 public SortedSet<E> headSet(E toElement) {
849 return new FilteredSortedSet<E>(((SortedSet<E>) unfiltered).headSet(toElement), predicate);
850 }
851
852 @Override
853 public SortedSet<E> tailSet(E fromElement) {
854 return new FilteredSortedSet<E>(((SortedSet<E>) unfiltered).tailSet(fromElement), predicate);
855 }
856
857 @Override
858 public E first() {
859 return iterator().next();
860 }
861
862 @Override
863 public E last() {
864 SortedSet<E> sortedUnfiltered = (SortedSet<E>) unfiltered;
865 while (true) {
866 E element = sortedUnfiltered.last();
867 if (predicate.apply(element)) {
868 return element;
869 }
870 sortedUnfiltered = sortedUnfiltered.headSet(element);
871 }
872 }
873 }
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904 @GwtIncompatible("NavigableSet")
905 @SuppressWarnings("unchecked")
906 public static <E> NavigableSet<E> filter(
907 NavigableSet<E> unfiltered, Predicate<? super E> predicate) {
908 if (unfiltered instanceof FilteredSet) {
909
910
911 FilteredSet<E> filtered = (FilteredSet<E>) unfiltered;
912 Predicate<E> combinedPredicate
913 = Predicates.<E>and(filtered.predicate, predicate);
914 return new FilteredNavigableSet<E>(
915 (NavigableSet<E>) filtered.unfiltered, combinedPredicate);
916 }
917
918 return new FilteredNavigableSet<E>(
919 checkNotNull(unfiltered), checkNotNull(predicate));
920 }
921
922 @GwtIncompatible("NavigableSet")
923 private static class FilteredNavigableSet<E> extends FilteredSortedSet<E>
924 implements NavigableSet<E> {
925 FilteredNavigableSet(NavigableSet<E> unfiltered, Predicate<? super E> predicate) {
926 super(unfiltered, predicate);
927 }
928
929 NavigableSet<E> unfiltered() {
930 return (NavigableSet<E>) unfiltered;
931 }
932
933 @Override
934 @Nullable
935 public E lower(E e) {
936 return Iterators.getNext(headSet(e, false).descendingIterator(), null);
937 }
938
939 @Override
940 @Nullable
941 public E floor(E e) {
942 return Iterators.getNext(headSet(e, true).descendingIterator(), null);
943 }
944
945 @Override
946 public E ceiling(E e) {
947 return Iterables.getFirst(tailSet(e, true), null);
948 }
949
950 @Override
951 public E higher(E e) {
952 return Iterables.getFirst(tailSet(e, false), null);
953 }
954
955 @Override
956 public E pollFirst() {
957 return Iterables.removeFirstMatching(unfiltered(), predicate);
958 }
959
960 @Override
961 public E pollLast() {
962 return Iterables.removeFirstMatching(unfiltered().descendingSet(), predicate);
963 }
964
965 @Override
966 public NavigableSet<E> descendingSet() {
967 return Sets.filter(unfiltered().descendingSet(), predicate);
968 }
969
970 @Override
971 public Iterator<E> descendingIterator() {
972 return Iterators.filter(unfiltered().descendingIterator(), predicate);
973 }
974
975 @Override
976 public E last() {
977 return descendingIterator().next();
978 }
979
980 @Override
981 public NavigableSet<E> subSet(
982 E fromElement, boolean fromInclusive, E toElement, boolean toInclusive) {
983 return filter(
984 unfiltered().subSet(fromElement, fromInclusive, toElement, toInclusive), predicate);
985 }
986
987 @Override
988 public NavigableSet<E> headSet(E toElement, boolean inclusive) {
989 return filter(unfiltered().headSet(toElement, inclusive), predicate);
990 }
991
992 @Override
993 public NavigableSet<E> tailSet(E fromElement, boolean inclusive) {
994 return filter(unfiltered().tailSet(fromElement, inclusive), predicate);
995 }
996 }
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053 public static <B> Set<List<B>> cartesianProduct(
1054 List<? extends Set<? extends B>> sets) {
1055 return CartesianSet.create(sets);
1056 }
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113 public static <B> Set<List<B>> cartesianProduct(
1114 Set<? extends B>... sets) {
1115 return cartesianProduct(Arrays.asList(sets));
1116 }
1117
1118 private static final class CartesianSet<E>
1119 extends ForwardingCollection<List<E>> implements Set<List<E>> {
1120 private transient final ImmutableList<ImmutableSet<E>> axes;
1121 private transient final CartesianList<E> delegate;
1122
1123 static <E> Set<List<E>> create(List<? extends Set<? extends E>> sets) {
1124 ImmutableList.Builder<ImmutableSet<E>> axesBuilder =
1125 new ImmutableList.Builder<ImmutableSet<E>>(sets.size());
1126 for (Set<? extends E> set : sets) {
1127 ImmutableSet<E> copy = ImmutableSet.copyOf(set);
1128 if (copy.isEmpty()) {
1129 return ImmutableSet.of();
1130 }
1131 axesBuilder.add(copy);
1132 }
1133 final ImmutableList<ImmutableSet<E>> axes = axesBuilder.build();
1134 ImmutableList<List<E>> listAxes = new ImmutableList<List<E>>() {
1135
1136 @Override
1137 public int size() {
1138 return axes.size();
1139 }
1140
1141 @Override
1142 public List<E> get(int index) {
1143 return axes.get(index).asList();
1144 }
1145
1146 @Override
1147 boolean isPartialView() {
1148 return true;
1149 }
1150 };
1151 return new CartesianSet<E>(axes, new CartesianList<E>(listAxes));
1152 }
1153
1154 private CartesianSet(
1155 ImmutableList<ImmutableSet<E>> axes, CartesianList<E> delegate) {
1156 this.axes = axes;
1157 this.delegate = delegate;
1158 }
1159
1160 @Override
1161 protected Collection<List<E>> delegate() {
1162 return delegate;
1163 }
1164
1165 @Override public boolean equals(@Nullable Object object) {
1166
1167
1168 if (object instanceof CartesianSet) {
1169 CartesianSet<?> that = (CartesianSet<?>) object;
1170 return this.axes.equals(that.axes);
1171 }
1172 return super.equals(object);
1173 }
1174
1175 @Override
1176 public int hashCode() {
1177
1178
1179
1180
1181 int adjust = size() - 1;
1182 for (int i = 0; i < axes.size(); i++) {
1183 adjust *= 31;
1184 adjust = ~~adjust;
1185
1186 }
1187 int hash = 1;
1188 for (Set<E> axis : axes) {
1189 hash = 31 * hash + (size() / axis.size() * axis.hashCode());
1190
1191 hash = ~~hash;
1192 }
1193 hash += adjust;
1194 return ~~hash;
1195 }
1196 }
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227 @GwtCompatible(serializable = false)
1228 public static <E> Set<Set<E>> powerSet(Set<E> set) {
1229 return new PowerSet<E>(set);
1230 }
1231
1232 private static final class SubSet<E> extends AbstractSet<E> {
1233 private final ImmutableMap<E, Integer> inputSet;
1234 private final int mask;
1235
1236 SubSet(ImmutableMap<E, Integer> inputSet, int mask) {
1237 this.inputSet = inputSet;
1238 this.mask = mask;
1239 }
1240
1241 @Override
1242 public Iterator<E> iterator() {
1243 return new UnmodifiableIterator<E>() {
1244 final ImmutableList<E> elements = inputSet.keySet().asList();
1245 int remainingSetBits = mask;
1246
1247 @Override
1248 public boolean hasNext() {
1249 return remainingSetBits != 0;
1250 }
1251
1252 @Override
1253 public E next() {
1254 int index = Integer.numberOfTrailingZeros(remainingSetBits);
1255 if (index == 32) {
1256 throw new NoSuchElementException();
1257 }
1258 remainingSetBits &= ~(1 << index);
1259 return elements.get(index);
1260 }
1261 };
1262 }
1263
1264 @Override
1265 public int size() {
1266 return Integer.bitCount(mask);
1267 }
1268
1269 @Override
1270 public boolean contains(@Nullable Object o) {
1271 Integer index = inputSet.get(o);
1272 return index != null && (mask & (1 << index)) != 0;
1273 }
1274 }
1275
1276 private static final class PowerSet<E> extends AbstractSet<Set<E>> {
1277 final ImmutableMap<E, Integer> inputSet;
1278
1279 PowerSet(Set<E> input) {
1280 ImmutableMap.Builder<E, Integer> builder = ImmutableMap.builder();
1281 int i = 0;
1282 for (E e : checkNotNull(input)) {
1283 builder.put(e, i++);
1284 }
1285 this.inputSet = builder.build();
1286 checkArgument(inputSet.size() <= 30,
1287 "Too many elements to create power set: %s > 30", inputSet.size());
1288 }
1289
1290 @Override public int size() {
1291 return 1 << inputSet.size();
1292 }
1293
1294 @Override public boolean isEmpty() {
1295 return false;
1296 }
1297
1298 @Override public Iterator<Set<E>> iterator() {
1299 return new AbstractIndexedListIterator<Set<E>>(size()) {
1300 @Override protected Set<E> get(final int setBits) {
1301 return new SubSet<E>(inputSet, setBits);
1302 }
1303 };
1304 }
1305
1306 @Override public boolean contains(@Nullable Object obj) {
1307 if (obj instanceof Set) {
1308 Set<?> set = (Set<?>) obj;
1309 return inputSet.keySet().containsAll(set);
1310 }
1311 return false;
1312 }
1313
1314 @Override public boolean equals(@Nullable Object obj) {
1315 if (obj instanceof PowerSet) {
1316 PowerSet<?> that = (PowerSet<?>) obj;
1317 return inputSet.equals(that.inputSet);
1318 }
1319 return super.equals(obj);
1320 }
1321
1322 @Override public int hashCode() {
1323
1324
1325
1326
1327
1328 return inputSet.keySet().hashCode() << (inputSet.size() - 1);
1329 }
1330
1331 @Override public String toString() {
1332 return "powerSet(" + inputSet + ")";
1333 }
1334 }
1335
1336
1337
1338
1339 static int hashCodeImpl(Set<?> s) {
1340 int hashCode = 0;
1341 for (Object o : s) {
1342 hashCode += o != null ? o.hashCode() : 0;
1343
1344 hashCode = ~~hashCode;
1345
1346 }
1347 return hashCode;
1348 }
1349
1350
1351
1352
1353 static boolean equalsImpl(Set<?> s, @Nullable Object object) {
1354 if (s == object) {
1355 return true;
1356 }
1357 if (object instanceof Set) {
1358 Set<?> o = (Set<?>) object;
1359
1360 try {
1361 return s.size() == o.size() && s.containsAll(o);
1362 } catch (NullPointerException ignored) {
1363 return false;
1364 } catch (ClassCastException ignored) {
1365 return false;
1366 }
1367 }
1368 return false;
1369 }
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387 @GwtIncompatible("NavigableSet")
1388 public static <E> NavigableSet<E> unmodifiableNavigableSet(
1389 NavigableSet<E> set) {
1390 if (set instanceof ImmutableSortedSet
1391 || set instanceof UnmodifiableNavigableSet) {
1392 return set;
1393 }
1394 return new UnmodifiableNavigableSet<E>(set);
1395 }
1396
1397 @GwtIncompatible("NavigableSet")
1398 static final class UnmodifiableNavigableSet<E>
1399 extends ForwardingSortedSet<E> implements NavigableSet<E>, Serializable {
1400 private final NavigableSet<E> delegate;
1401
1402 UnmodifiableNavigableSet(NavigableSet<E> delegate) {
1403 this.delegate = checkNotNull(delegate);
1404 }
1405
1406 @Override
1407 protected SortedSet<E> delegate() {
1408 return Collections.unmodifiableSortedSet(delegate);
1409 }
1410
1411 @Override
1412 public E lower(E e) {
1413 return delegate.lower(e);
1414 }
1415
1416 @Override
1417 public E floor(E e) {
1418 return delegate.floor(e);
1419 }
1420
1421 @Override
1422 public E ceiling(E e) {
1423 return delegate.ceiling(e);
1424 }
1425
1426 @Override
1427 public E higher(E e) {
1428 return delegate.higher(e);
1429 }
1430
1431 @Override
1432 public E pollFirst() {
1433 throw new UnsupportedOperationException();
1434 }
1435
1436 @Override
1437 public E pollLast() {
1438 throw new UnsupportedOperationException();
1439 }
1440
1441 private transient UnmodifiableNavigableSet<E> descendingSet;
1442
1443 @Override
1444 public NavigableSet<E> descendingSet() {
1445 UnmodifiableNavigableSet<E> result = descendingSet;
1446 if (result == null) {
1447 result = descendingSet = new UnmodifiableNavigableSet<E>(
1448 delegate.descendingSet());
1449 result.descendingSet = this;
1450 }
1451 return result;
1452 }
1453
1454 @Override
1455 public Iterator<E> descendingIterator() {
1456 return Iterators.unmodifiableIterator(delegate.descendingIterator());
1457 }
1458
1459 @Override
1460 public NavigableSet<E> subSet(
1461 E fromElement,
1462 boolean fromInclusive,
1463 E toElement,
1464 boolean toInclusive) {
1465 return unmodifiableNavigableSet(delegate.subSet(
1466 fromElement,
1467 fromInclusive,
1468 toElement,
1469 toInclusive));
1470 }
1471
1472 @Override
1473 public NavigableSet<E> headSet(E toElement, boolean inclusive) {
1474 return unmodifiableNavigableSet(delegate.headSet(toElement, inclusive));
1475 }
1476
1477 @Override
1478 public NavigableSet<E> tailSet(E fromElement, boolean inclusive) {
1479 return unmodifiableNavigableSet(
1480 delegate.tailSet(fromElement, inclusive));
1481 }
1482
1483 private static final long serialVersionUID = 0;
1484 }
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529 @GwtIncompatible("NavigableSet")
1530 public static <E> NavigableSet<E> synchronizedNavigableSet(
1531 NavigableSet<E> navigableSet) {
1532 return Synchronized.navigableSet(navigableSet);
1533 }
1534
1535
1536
1537
1538 static boolean removeAllImpl(Set<?> set, Iterator<?> iterator) {
1539 boolean changed = false;
1540 while (iterator.hasNext()) {
1541 changed |= set.remove(iterator.next());
1542 }
1543 return changed;
1544 }
1545
1546 static boolean removeAllImpl(Set<?> set, Collection<?> collection) {
1547 checkNotNull(collection);
1548 if (collection instanceof Multiset) {
1549 collection = ((Multiset<?>) collection).elementSet();
1550 }
1551
1552
1553
1554
1555
1556
1557
1558 if (collection instanceof Set && collection.size() > set.size()) {
1559 return Iterators.removeAll(set.iterator(), collection);
1560 } else {
1561 return removeAllImpl(set, collection.iterator());
1562 }
1563 }
1564
1565 @GwtIncompatible("NavigableSet")
1566 static class DescendingSet<E> extends ForwardingNavigableSet<E> {
1567 private final NavigableSet<E> forward;
1568
1569 DescendingSet(NavigableSet<E> forward) {
1570 this.forward = forward;
1571 }
1572
1573 @Override
1574 protected NavigableSet<E> delegate() {
1575 return forward;
1576 }
1577
1578 @Override
1579 public E lower(E e) {
1580 return forward.higher(e);
1581 }
1582
1583 @Override
1584 public E floor(E e) {
1585 return forward.ceiling(e);
1586 }
1587
1588 @Override
1589 public E ceiling(E e) {
1590 return forward.floor(e);
1591 }
1592
1593 @Override
1594 public E higher(E e) {
1595 return forward.lower(e);
1596 }
1597
1598 @Override
1599 public E pollFirst() {
1600 return forward.pollLast();
1601 }
1602
1603 @Override
1604 public E pollLast() {
1605 return forward.pollFirst();
1606 }
1607
1608 @Override
1609 public NavigableSet<E> descendingSet() {
1610 return forward;
1611 }
1612
1613 @Override
1614 public Iterator<E> descendingIterator() {
1615 return forward.iterator();
1616 }
1617
1618 @Override
1619 public NavigableSet<E> subSet(
1620 E fromElement,
1621 boolean fromInclusive,
1622 E toElement,
1623 boolean toInclusive) {
1624 return forward.subSet(toElement, toInclusive, fromElement, fromInclusive).descendingSet();
1625 }
1626
1627 @Override
1628 public NavigableSet<E> headSet(E toElement, boolean inclusive) {
1629 return forward.tailSet(toElement, inclusive).descendingSet();
1630 }
1631
1632 @Override
1633 public NavigableSet<E> tailSet(E fromElement, boolean inclusive) {
1634 return forward.headSet(fromElement, inclusive).descendingSet();
1635 }
1636
1637 @SuppressWarnings("unchecked")
1638 @Override
1639 public Comparator<? super E> comparator() {
1640 Comparator<? super E> forwardComparator = forward.comparator();
1641 if (forwardComparator == null) {
1642 return (Comparator) Ordering.natural().reverse();
1643 } else {
1644 return reverse(forwardComparator);
1645 }
1646 }
1647
1648
1649 private static <T> Ordering<T> reverse(Comparator<T> forward) {
1650 return Ordering.from(forward).reverse();
1651 }
1652
1653 @Override
1654 public E first() {
1655 return forward.last();
1656 }
1657
1658 @Override
1659 public SortedSet<E> headSet(E toElement) {
1660 return standardHeadSet(toElement);
1661 }
1662
1663 @Override
1664 public E last() {
1665 return forward.first();
1666 }
1667
1668 @Override
1669 public SortedSet<E> subSet(E fromElement, E toElement) {
1670 return standardSubSet(fromElement, toElement);
1671 }
1672
1673 @Override
1674 public SortedSet<E> tailSet(E fromElement) {
1675 return standardTailSet(fromElement);
1676 }
1677
1678 @Override
1679 public Iterator<E> iterator() {
1680 return forward.descendingIterator();
1681 }
1682
1683 @Override
1684 public Object[] toArray() {
1685 return standardToArray();
1686 }
1687
1688 @Override
1689 public <T> T[] toArray(T[] array) {
1690 return standardToArray(array);
1691 }
1692
1693 @Override
1694 public String toString() {
1695 return standardToString();
1696 }
1697 }
1698 }